import vue from '@vitejs/plugin-vue'
import type { Plugin } from 'vite';



/**
 * 自动导入 vue、vue-router 和 pinia 的 API
 * 自动导入这些库的常用方法（如 ref、computed、useRouter 等），无需手动导入
 */

import AutoImport from 'unplugin-auto-import/vite'
//明确返回类型是Plugin
const createAutoImport = (): Plugin[] => {  // 明确指定返回类型为 Plugin
  const result = AutoImport({
    imports: [
       'vue',// 自动导入所有 Vue API（包括 ref, reactive 等）
       'vue-router', // Vue 路由相关 API
       'pinia'// Pinia 状态管理 API
      ],
      dts: true // ts环境用这个，生成类型声明文件
      //dts: false //js环境用这个，不生成dts文件
  });

  // 如果是单个插件，转为数组
  return Array.isArray(result) ? result : [result];
}


/**
 * 这段代码是 Vue.js 项目中用于配置 SVG 图标处理的插件，主要用于将 SVG 图标文件转换为可用的 Vue 组件或雪碧图（SVG Sprite）。
 * 在 RuoYi-Vue（基于 Vue 3 的若依前端框架）中，它通常用于管理项目的 SVG 图标资源。
 *  性能优化：
    所有图标合并为一个文件，减少HTTP请求
    生产环境压缩可减小文件体积
    开发便利：
    自动检测新增/修改的SVG文件
    无需手动导入每个图标
    一致性：
    统一的ID命名规则便于维护
 */
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'

const  createSvgIcon = (isBuild:boolean) =>{
    return createSvgIconsPlugin({
		iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
        symbolId: 'icon-[dir]-[name]',
        svgoOptions: isBuild
    })
}




/**
 * 这会同时启用 Gzip 和 Brotli 压缩。总结：这段代码为 Vite 项目提供了可定制的生产环境压缩方案，提升页面加载速度。
 * 修改.env文件 VITE_BUILD_COMPRESS=gzip,brotli
 */


import compression from 'vite-plugin-compression2';

interface CompressionEnv {
  VITE_BUILD_COMPRESS?: string;
}

const createCompression = (env: CompressionEnv): Plugin[] => {
  const { VITE_BUILD_COMPRESS } = env;
  const plugins: Plugin[] = [];
  
  if (VITE_BUILD_COMPRESS) {
    const compressList = VITE_BUILD_COMPRESS.split(',');
    
    // Gzip 压缩配置
    if (compressList.includes('gzip')) {
      plugins.push(
        compression({
          algorithms: ['gzip'], // 使用复数形式 algorithms
          exclude: [/\.(br|gz)$/],
          threshold: 1025,
          deleteOriginalAssets: false,
        })
      );
    }
    
    // Brotli 压缩配置
    if (compressList.includes('brotli')) {
      plugins.push(
        compression({
          algorithms: ['brotli'], // 使用复数形式 algorithms
          exclude: [/\.(br|gz)$/],
          threshold: 1025,
          deleteOriginalAssets: false,
        })
      );
    }
  }
  
  return plugins;
};

/**
 * 允许在 <script setup> 中直接定义组件的 ​name、inheritAttrs​ 等选项，而无需额外包裹 <script> 
 */

import setupExtend from 'unplugin-vue-setup-extend-plus/vite'

const createSetupExtend = (): Plugin[]=> {
    const r = setupExtend({})
     return Array.isArray(r) ? r  : [r ];
}



//安装pnpm add -D unocss
import UnoCSS from 'unocss/vite'
import {
  defineConfig,
  presetAttributify,
  presetIcons,
  presetTypography,
  presetWebFonts,
  presetWind3,
  transformerDirectives,
  transformerVariantGroup
} from 'unocss' // 导入预设

const createUnoCSSPlugin = ():Plugin[] =>{
  const unocssConfig = defineConfig({

    presets: [
      presetWind3(),
      presetAttributify(),
      //npm install @iconify-json/mdi
      presetIcons({
        // 关键：配置图标预设
        autoInstall: true, // 自动安装图标集（当使用的图标不存在时）
        extraProperties: {
          'display': 'inline-block',
          'vertical-align': 'middle',
          'width': '1.2em',
          'height': '1.2em',
        }
      }),
      presetTypography(),
      presetWebFonts({
        fonts: {
          // ...
        }
      })
    ],
    transformers: [transformerDirectives(), transformerVariantGroup()]
  })

  return UnoCSS(unocssConfig)
}




import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
//用于vite.config.ts，每个VUE文件无需导入ref toRefs等API
export default function createVitePlugins(viteEnv: CompressionEnv, isBuild = false) {
  /*按需导入
    const vitePlugins = [vue(),    
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
    Components({
      resolvers: [ElementPlusResolver()],
    })]
    */


   

    const vitePlugins = [vue()]
    vitePlugins.push(...createUnoCSSPlugin())
    vitePlugins.push(...createAutoImport())
	  vitePlugins.push(...createSetupExtend())
    vitePlugins.push(createSvgIcon(isBuild))
	isBuild && vitePlugins.push(...createCompression(viteEnv))
    return vitePlugins
}
